home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / x11-common.config < prev    next >
Text File  |  2008-10-24  |  35KB  |  1,097 lines

  1. #!/bin/sh
  2. # Debian x11-common package configuration script
  3. # Copyright 2000--2003 Branden Robinson.
  4. # Licensed under the GNU General Public License, version 2.  See the file
  5. # /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
  6.  
  7. set -e
  8.  
  9. # source debconf library
  10. . /usr/share/debconf/confmodule
  11.  
  12. THIS_PACKAGE=x11-common
  13. THIS_SCRIPT=config
  14.  
  15. # $Id$
  16.  
  17. # This is the X Strike Force shell library for X Window System package
  18. # maintainer scripts.  It serves to define shell functions commonly used by
  19. # such packages, and performs some error checking necessary for proper operation
  20. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  21. # invoke the functions defined here to accomplish package installation and
  22. # removal tasks.
  23.  
  24. # If you are reading this within a Debian package maintainer script (e.g.,
  25. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  26. # skip past this library by scanning forward in this file to the string
  27. # "GOBSTOPPER".
  28.  
  29. SOURCE_VERSION=1:7.4~5ubuntu3
  30. OFFICIAL_BUILD=
  31.  
  32. # Use special abnormal exit codes so that problems with this library are more
  33. # easily tracked down.
  34. SHELL_LIB_INTERNAL_ERROR=86
  35. SHELL_LIB_THROWN_ERROR=74
  36. SHELL_LIB_USAGE_ERROR=99
  37.  
  38. # old -> new variable names
  39. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  40.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  41. fi
  42. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  43.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  44. fi
  45.  
  46. # initial sanity checks
  47. if [ -z "$THIS_PACKAGE" ]; then
  48.   cat >&2 <<EOF
  49. Error: package maintainer script attempted to use shell library without
  50. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  51. version, and the text of this error message to the Debian Bug Tracking System.
  52. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  53. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  54. "doc-debian" package, or install the "reportbug" package and use the command of
  55. the same name to file a report against version $SOURCE_VERSION of this package.
  56. EOF
  57.   exit $SHELL_LIB_USAGE_ERROR
  58. fi
  59.  
  60. if [ -z "$THIS_SCRIPT" ]; then
  61.   cat >&2 <<EOF
  62. Error: package maintainer script attempted to use shell library without
  63. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  64. version, and the text of this error message to the Debian Bug Tracking System.
  65. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  66. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  67. "doc-debian" package, or install the "reportbug" package and use the command of
  68. the same name to file a report against version $SOURCE_VERSION of the
  69. "$THIS_PACKAGE" package.
  70. EOF
  71.   exit $SHELL_LIB_USAGE_ERROR
  72. fi
  73.  
  74. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  75.  
  76. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  77.   RECONFIGURE="true"
  78. else
  79.   RECONFIGURE=
  80. fi
  81.  
  82. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  83.   FIRSTINST="yes"
  84. fi
  85.  
  86. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  87.   UPGRADE="yes"
  88. fi
  89.  
  90. trap "message;\
  91.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  92.       message;\
  93.       exit 1" HUP INT QUIT TERM
  94.  
  95. reject_nondigits () {
  96.   # syntax: reject_nondigits [ operand ... ]
  97.   #
  98.   # scan operands (typically shell variables whose values cannot be trusted) for
  99.   # characters other than decimal digits and barf if any are found
  100.   while [ -n "$1" ]; do
  101.     # does the operand contain anything but digits?
  102.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  103.       # can't use die(), because it wraps message() which wraps this function
  104.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  105.            "possibly malicious garbage \"$1\"" >&2
  106.       exit $SHELL_LIB_THROWN_ERROR
  107.     fi
  108.     shift
  109.   done
  110. }
  111.  
  112. reject_whitespace () {
  113.   # syntax: reject_whitespace [ operand ]
  114.   #
  115.   # scan operand (typically a shell variable whose value cannot be trusted) for
  116.   # whitespace characters and barf if any are found
  117.   if [ -n "$1" ]; then
  118.     # does the operand contain any whitespace?
  119.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  120.       # can't use die(), because I want to avoid forward references
  121.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  122.            "possibly malicious garbage \"$1\"" >&2
  123.       exit $SHELL_LIB_THROWN_ERROR
  124.     fi
  125.   fi
  126. }
  127.  
  128. reject_unlikely_path_chars () {
  129.   # syntax: reject_unlikely_path_chars [ operand ... ]
  130.   #
  131.   # scan operands (typically shell variables whose values cannot be trusted) for
  132.   # characters unlikely to be seen in a path and which the shell might
  133.   # interpret and barf if any are found
  134.   while [ -n "$1" ]; do
  135.     # does the operand contain any funny characters?
  136.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  137.       # can't use die(), because I want to avoid forward references
  138.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  139.            "encountered possibly malicious garbage \"$1\"" >&2
  140.       exit $SHELL_LIB_THROWN_ERROR
  141.     fi
  142.     shift
  143.   done
  144. }
  145.  
  146. # Query the terminal to establish a default number of columns to use for
  147. # displaying messages to the user.  This is used only as a fallback in the
  148. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  149. # the script is running, and this cannot, only being calculated once.)
  150. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  151. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  152.   DEFCOLUMNS=80
  153. fi
  154.  
  155. message () {
  156.   # pretty-print messages of arbitrary length
  157.   reject_nondigits "$COLUMNS"
  158.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  159. }
  160.  
  161. observe () {
  162.   # syntax: observe message ...
  163.   #
  164.   # issue observational message suitable for logging someday when support for
  165.   # it exists in dpkg
  166.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  167.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  168.   fi
  169. }
  170.  
  171. warn () {
  172.   # syntax: warn message ...
  173.   #
  174.   # issue warning message suitable for logging someday when support for
  175.   # it exists in dpkg; also send to standard error
  176.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  177. }
  178.  
  179. die () {
  180.   # syntax: die message ...
  181.   #
  182.   # exit script with error message
  183.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  184.   exit $SHELL_LIB_THROWN_ERROR
  185. }
  186.  
  187. internal_error () {
  188.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  189.   message "internal error: $*"
  190.   if [ -n "$OFFICIAL_BUILD" ]; then
  191.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  192.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  193.             "Tracking System.  Include all messages above that mention the" \
  194.             "$THIS_PACKAGE package.  Visit " \
  195.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  196.             "instructions, read the file" \
  197.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  198.             "package, or install the reportbug package and use the command of" \
  199.             "the same name to file a report."
  200.   fi
  201.   exit $SHELL_LIB_INTERNAL_ERROR
  202. }
  203.  
  204. usage_error () {
  205.   message "usage error: $*"
  206.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  207.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  208.           "Tracking System.  Include all messages above that mention the" \
  209.           "$THIS_PACKAGE package.  Visit " \
  210.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  211.           "instructions, read the file" \
  212.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  213.           "package, or install the reportbug package and use the command of" \
  214.           "the same name to file a report."
  215.   exit $SHELL_LIB_USAGE_ERROR
  216. }
  217.  
  218.  
  219. maplink () {
  220.   # returns what symlink should point to; i.e., what the "sane" answer is
  221.   # Keep this in sync with the debian/*.links files.
  222.   # This is only needed for symlinks to directories.
  223.   #
  224.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  225.   # If we've stopped using this function, fixing it might enable us to re-enable
  226.   # it again and catch more errors.
  227.   case "$1" in
  228.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  229.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  230.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  231.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  232.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  233.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  234.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  235.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  236.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  237.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  238.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  239.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  240.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  241.     /usr/bin/X11) echo ../X11R6/bin ;;
  242.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  243.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  244.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  245.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  246.   esac
  247. }
  248.  
  249. analyze_path () {
  250.   # given a supplied set of pathnames, break each one up by directory and do an
  251.   # ls -dl on each component, cumulatively; i.e.
  252.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  253.   # Thanks to Randolph Chung for this clever hack.
  254.  
  255.   local f g
  256.  
  257.   while [ -n "$1" ]; do
  258.     reject_whitespace "$1"
  259.     g=
  260.     message "Analyzing $1:"
  261.     for f in $(echo "$1" | tr / \  ); do
  262.       if [ -e /$g$f ]; then
  263.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  264.         g=$g$f/
  265.       else
  266.         message "/$g$f: nonexistent; directory contents of /$g:"
  267.         ls -l /$g
  268.         break
  269.       fi
  270.     done
  271.     shift
  272.   done
  273. }
  274.  
  275. find_culprits () {
  276.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  277.     msg
  278.  
  279.   reject_whitespace "$1"
  280.   message "Searching for overlapping packages..."
  281.   dpkg_info_dir=/var/lib/dpkg/info
  282.   if [ -d $dpkg_info_dir ]; then
  283.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  284.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  285.         "(xbase-clients|x11-common|xfs|xlibs)")
  286.       if [ -n "$possible_culprits" ]; then
  287.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  288.         if [ -n "$smoking_guns" ]; then
  289.           bad_packages=$(printf "\\n")
  290.           for f in $smoking_guns; do
  291.             # too bad you can't nest parameter expansion voodoo
  292.             p=${f%*.list}      # strip off the trailing ".list"
  293.             package=${p##*/}   # strip off the directories
  294.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  295.           done
  296.           msg=$(cat <<EOF
  297. The following packages appear to have file overlaps with the X.Org packages;
  298. these packages are either very old, or in violation of Debian Policy.  Try
  299. upgrading each of these packages to the latest available version if possible:
  300. for example, with the command "apt-get install".  If no newer version of a
  301. package is available, you will have to remove it; for example, with the command
  302. "apt-get remove".  If even the latest available version of the package has
  303. this file overlap, please file a bug against that package with the Debian Bug
  304. Tracking System.  You may want to refer the package maintainer to section 12.8
  305. of the Debian Policy manual.
  306. EOF
  307. )
  308.           message "$msg"
  309.           message "The overlapping packages are: $bad_packages"
  310.         else
  311.           message "no overlaps found."
  312.         fi
  313.       fi
  314.     else
  315.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  316.     fi
  317.   else
  318.     message "cannot search; $dpkg_info_dir does not exist."
  319.   fi
  320. }
  321.  
  322. # we require a readlink command or shell function
  323. if ! which readlink > /dev/null 2>&1; then
  324.   message "The readlink command was not found.  Please install version" \
  325.           "1.13.1 or later of the debianutils package."
  326.   readlink () {
  327.     # returns what symlink in $1 actually points to
  328.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  329.   }
  330. fi
  331.  
  332. check_symlink () {
  333.   # syntax: check_symlink symlink
  334.   #
  335.   # See if specified symlink points where it is supposed to.  Return 0 if it
  336.   # does, and 1 if it does not.
  337.   #
  338.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  339.  
  340.   local symlink
  341.  
  342.   # validate arguments
  343.   if [ $# -ne 1 ]; then
  344.     usage_error "check_symlink() called with wrong number of arguments;" \
  345.                 "expected 1, got $#"
  346.     exit $SHELL_LIB_USAGE_ERROR
  347.   fi
  348.  
  349.   symlink="$1"
  350.  
  351.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  352.     return 0
  353.   else
  354.     return 1
  355.   fi
  356. }
  357.  
  358. check_symlinks_and_warn () {
  359.   # syntax: check_symlinks_and_warn symlink ...
  360.   #
  361.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  362.   #
  363.   # Call this function from a preinst script in the event $1 is "upgrade" or
  364.   # "install".
  365.  
  366.   local errmsg symlink
  367.  
  368.   # validate arguments
  369.   if [ $# -lt 1 ]; then
  370.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  371.                 "arguments; expected at least 1, got $#"
  372.     exit $SHELL_LIB_USAGE_ERROR
  373.   fi
  374.  
  375.   while [ -n "$1" ]; do
  376.     symlink="$1"
  377.     if [ -L "$symlink" ]; then
  378.       if ! check_symlink "$symlink"; then
  379.         observe "$symlink symbolic link points to wrong location" \
  380.                 "$(readlink "$symlink"); removing"
  381.         rm "$symlink"
  382.       fi
  383.     elif [ -e "$symlink" ]; then
  384.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  385.       errmsg="$errmsg be installed until this"
  386.       if [ -f "$symlink" ]; then
  387.         errmsg="$errmsg file"
  388.       elif [ -d "$symlink" ]; then
  389.         errmsg="$errmsg directory"
  390.       else
  391.         errmsg="$errmsg thing"
  392.       fi
  393.       errmsg="$errmsg is removed"
  394.       die "$errmsg"
  395.     fi
  396.     shift
  397.   done
  398. }
  399.  
  400. check_symlinks_and_bomb () {
  401.   # syntax: check_symlinks_and_bomb symlink ...
  402.   #
  403.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  404.   #
  405.   # Call this function from a postinst script.
  406.  
  407.   local problem symlink
  408.  
  409.   # validate arguments
  410.   if [ $# -lt 1 ]; then
  411.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  412.                 "arguments; expected at least 1, got $#"
  413.     exit $SHELL_LIB_USAGE_ERROR
  414.   fi
  415.  
  416.   while [ -n "$1" ]; do
  417.     problem=
  418.     symlink="$1"
  419.     if [ -L "$symlink" ]; then
  420.       if ! check_symlink "$symlink"; then
  421.         problem=yes
  422.         warn "$symlink symbolic link points to wrong location" \
  423.              "$(readlink "$symlink")"
  424.       fi
  425.     elif [ -e "$symlink" ]; then
  426.       problem=yes
  427.       warn "$symlink is not a symbolic link"
  428.     else
  429.       problem=yes
  430.       warn "$symlink symbolic link does not exist"
  431.     fi
  432.     if [ -n "$problem" ]; then
  433.       analyze_path "$symlink" "$(readlink "$symlink")"
  434.       find_culprits "$symlink"
  435.       die "bad symbolic links on system"
  436.     fi
  437.     shift
  438.   done
  439. }
  440.  
  441. font_update () {
  442.   # run $UPDATECMDS in $FONTDIRS
  443.  
  444.   local dir cmd shortcmd x_font_dir_prefix
  445.  
  446.   x_font_dir_prefix="/usr/share/fonts/X11"
  447.  
  448.   if [ -z "$UPDATECMDS" ]; then
  449.     usage_error "font_update() called but \$UPDATECMDS not set"
  450.   fi
  451.   if [ -z "$FONTDIRS" ]; then
  452.     usage_error "font_update() called but \$FONTDIRS not set"
  453.   fi
  454.  
  455.   reject_unlikely_path_chars "$UPDATECMDS"
  456.   reject_unlikely_path_chars "$FONTDIRS"
  457.  
  458.   for dir in $FONTDIRS; do
  459.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  460.       for cmd in $UPDATECMDS; do
  461.         if which "$cmd" > /dev/null 2>&1; then
  462.           shortcmd=${cmd##*/}
  463.           observe "running $shortcmd in $dir font directory"
  464.       cmd_opts=
  465.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  466.             cmd_opts=--x11r7-layout
  467.           fi
  468.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  469.             cmd_opts=--x11r7-layout
  470.           fi
  471.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  472.             cmd_opts=--x11r7-layout
  473.           fi
  474.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  475.                               "failed; font directory data may not" \
  476.                               "be up to date"
  477.         else
  478.           warn "$cmd not found; not updating corresponding $dir font" \
  479.                "directory data"
  480.         fi
  481.       done
  482.     else
  483.       warn "$dir is not a directory; not updating font directory data"
  484.     fi
  485.   done
  486. }
  487.  
  488. remove_conffile_prepare () {
  489.   # syntax: remove_conffile_prepare filename official_md5sum ...
  490.   #
  491.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  492.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  493.   # operands provided, then prepare the conffile for removal from the system.
  494.   # We defer actual deletion until the package is configured so that we can
  495.   # roll this operation back if package installation fails.
  496.   #
  497.   # Call this function from a preinst script in the event $1 is "upgrade" or
  498.   # "install" and verify $2 to ensure the package is being upgraded from a
  499.   # version (or installed over a version removed-but-not-purged) prior to the
  500.   # one in which the conffile was obsoleted.
  501.  
  502.   local conffile current_checksum
  503.  
  504.   # validate arguments
  505.   if [ $# -lt 2 ]; then
  506.     usage_error "remove_conffile_prepare() called with wrong number of" \
  507.                 "arguments; expected at least 2, got $#"
  508.     exit $SHELL_LIB_USAGE_ERROR
  509.   fi
  510.  
  511.   conffile="$1"
  512.   shift
  513.  
  514.   # does the conffile even exist?
  515.   if [ -e "$conffile" ]; then
  516.     # calculate its checksum
  517.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  518.     # compare it to each supplied checksum
  519.     while [ -n "$1" ]; do
  520.       if [ "$current_checksum" = "$1" ]; then
  521.         # we found a match; move the confffile and stop looking
  522.         observe "preparing obsolete conffile $conffile for removal"
  523.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  524.         break
  525.       fi
  526.       shift
  527.     done
  528.   fi
  529. }
  530.  
  531. remove_conffile_lookup () {
  532.   # syntax: remove_conffile_lookup package filename
  533.   #
  534.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  535.   # if it matches the actual file's md5sum.
  536.   #
  537.   # Call this function when you would call remove_conffile_prepare but only
  538.   # want to check against dpkg's status database instead of known checksums.
  539.  
  540.   local package conffile old_md5sum
  541.  
  542.   # validate arguments
  543.   if [ $# -ne 2 ]; then
  544.     usage_error "remove_conffile_lookup() called with wrong number of" \
  545.                 "arguments; expected 1, got $#"
  546.     exit $SHELL_LIB_USAGE_ERROR
  547.   fi
  548.  
  549.   package="$1"
  550.   conffile="$2"
  551.  
  552.   if ! [ -e "$conffile" ]; then
  553.     return
  554.   fi
  555.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  556.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  557.   if [ -n "$old_md5sum" ]; then
  558.     remove_conffile_prepare "$conffile" "$old_md5sum"
  559.   fi
  560. }
  561.  
  562. remove_conffile_commit () {
  563.   # syntax: remove_conffile_commit filename
  564.   #
  565.   # Complete the removal of a conffile "filename" that has become obsolete.
  566.   #
  567.   # Call this function from a postinst script after having used
  568.   # remove_conffile_prepare() in the preinst.
  569.  
  570.   local conffile
  571.  
  572.   # validate arguments
  573.   if [ $# -ne 1 ]; then
  574.     usage_error "remove_conffile_commit() called with wrong number of" \
  575.                 "arguments; expected 1, got $#"
  576.     exit $SHELL_LIB_USAGE_ERROR
  577.   fi
  578.  
  579.   conffile="$1"
  580.  
  581.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  582.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  583.     observe "committing removal of obsolete conffile $conffile"
  584.     rm "$conffile.$THIS_PACKAGE-tmp"
  585.   fi
  586. }
  587.  
  588. remove_conffile_rollback () {
  589.   # syntax: remove_conffile_rollback filename
  590.   #
  591.   # Roll back the removal of a conffile "filename".
  592.   #
  593.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  594.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  595.   # preinst.
  596.  
  597.   local conffile
  598.  
  599.   # validate arguments
  600.   if [ $# -ne 1 ]; then
  601.     usage_error "remove_conffile_rollback() called with wrong number of" \
  602.                 "arguments; expected 1, got $#"
  603.     exit $SHELL_LIB_USAGE_ERROR
  604.   fi
  605.  
  606.   conffile="$1"
  607.  
  608.   # if the temporary file created by remove_conffile_prepare() exists, move it
  609.   # back
  610.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  611.     observe "rolling back removal of obsolete conffile $conffile"
  612.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  613.   fi
  614. }
  615.  
  616. replace_conffile_with_symlink_prepare () {
  617.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  618.   # official_md5sum ...
  619.   #
  620.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  621.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  622.   # operands provided, then prepare the conffile for removal from the system.
  623.   # We defer actual deletion until the package is configured so that we can
  624.   # roll this operation back if package installation fails. Otherwise copy it
  625.   # to newfilename and let dpkg handle it through conffiles mechanism.
  626.   #
  627.   # Call this function from a preinst script in the event $1 is "upgrade" or
  628.   # "install" and verify $2 to ensure the package is being upgraded from a
  629.   # version (or installed over a version removed-but-not-purged) prior to the
  630.   # one in which the conffile was obsoleted.
  631.  
  632.   local conffile current_checksum
  633.  
  634.   # validate arguments
  635.   if [ $# -lt 3 ]; then
  636.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  637.                 " number of arguments; expected at least 3, got $#"
  638.     exit $SHELL_LIB_USAGE_ERROR
  639.   fi
  640.  
  641.   oldconffile="$1"
  642.   shift
  643.   newconffile="$1"
  644.   shift
  645.  
  646.   remove_conffile_prepare "$_oldconffile" "$@"
  647.   # If $oldconffile still exists, then md5sums didn't match.
  648.   # Copy it to new one.
  649.   if [ -f "$oldconffile" ]; then
  650.     cp "$oldconffile" "$newconffile"
  651.   fi
  652.  
  653. }
  654.  
  655. replace_conffile_with_symlink_commit () {
  656.   # syntax: replace_conffile_with_symlink_commit oldfilename
  657.   #
  658.   # Complete the removal of a conffile "oldfilename" that has been
  659.   # replaced by a symlink.
  660.   #
  661.   # Call this function from a postinst script after having used
  662.   # replace_conffile_with_symlink_prepare() in the preinst.
  663.  
  664.   local conffile
  665.  
  666.   # validate arguments
  667.   if [ $# -ne 1 ]; then
  668.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  669.                 "number of arguments; expected 1, got $#"
  670.     exit $SHELL_LIB_USAGE_ERROR
  671.   fi
  672.  
  673.   conffile="$1"
  674.  
  675.   remove_conffile_commit "$conffile"
  676. }
  677.  
  678. replace_conffile_with_symlink_rollback () {
  679.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  680.   #
  681.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  682.   # "newfilename".
  683.   #
  684.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  685.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  686.   # from a version (or install over a version removed-but-not-purged) prior
  687.   # to the one in which the conffile was obsoleted.
  688.   # You should have  used replace_conffile_with_symlink_prepare() in the
  689.   # preinst.
  690.  
  691.   local conffile
  692.  
  693.   # validate arguments
  694.   if [ $# -ne 2 ]; then
  695.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  696.                 "number of arguments; expected 2, got $#"
  697.     exit $SHELL_LIB_USAGE_ERROR
  698.   fi
  699.  
  700.   oldconffile="$1"
  701.   newconffile="$2"
  702.  
  703.   remove_conffile_rollback "$_oldconffile"
  704.   if [ -f "$newconffile" ]; then
  705.     rm "$newconffile"
  706.   fi
  707. }
  708.  
  709. run () {
  710.   # syntax: run command [ argument ... ]
  711.   #
  712.   # Run specified command with optional arguments and report its exit status.
  713.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  714.   # or commands whose failure is not fatal to us.
  715.   #
  716.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  717.   # those cases the return value of the debconf command *must* be checked
  718.   # before the string returned by debconf is used for anything.
  719.  
  720.   local retval
  721.  
  722.   # validate arguments
  723.   if [ $# -lt 1 ]; then
  724.     usage_error "run() called with wrong number of arguments; expected at" \
  725.                 "least 1, got $#"
  726.     exit $SHELL_LIB_USAGE_ERROR
  727.   fi
  728.  
  729.   "$@" || retval=$?
  730.  
  731.   if [ ${retval:-0} -ne 0 ]; then
  732.     observe "command \"$*\" exited with status $retval"
  733.   fi
  734. }
  735.  
  736. register_x_lib_dir_with_ld_so () {
  737.   # syntax: register_x_lib_dir_with_ld_so
  738.   #
  739.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  740.   # libraries.
  741.   #
  742.   # Call this function from the postinst script of a package that places a
  743.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  744.  
  745.   local dir ldsoconf
  746.  
  747.   dir="/usr/X11R6/lib"
  748.   ldsoconf="/etc/ld.so.conf"
  749.  
  750.   # is the line not already present?
  751.   if ! fgrep -qsx "$dir" "$ldsoconf"; then
  752.     observe "adding $dir directory to $ldsoconf"
  753.     echo "$dir" >> "$ldsoconf"
  754.   fi
  755. }
  756.  
  757. deregister_x_lib_dir_with_ld_so () {
  758.   # syntax: deregister_x_lib_dir_with_ld_so
  759.   #
  760.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  761.   # libraries, if and only if no shared libaries remain there.
  762.   #
  763.   # Call this function from the postrm script of a package that places a shared
  764.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  765.   # invoking ldconfig.
  766.  
  767.   local dir ldsoconf fgrep_status cmp_status
  768.  
  769.   dir="/usr/X11R6/lib"
  770.   ldsoconf="/etc/ld.so.conf"
  771.  
  772.   # is the line present?
  773.   if fgrep -qsx "$dir" "$ldsoconf"; then
  774.     # are there any shared objects in the directory?
  775.     if [ "$(echo "$dir"/lib*.so.*.*)" = "$dir/lib*.so.*.*" ]; then
  776.       # glob expansion produced nothing, so no shared libraries are present
  777.       observe "removing $dir directory from $ldsoconf"
  778.       # rewrite the file (very carefully)
  779.       set +e
  780.       fgrep -svx "$dir" "$ldsoconf" > "$ldsoconf.dpkg-tmp"
  781.       fgrep_status=$?
  782.       set -e
  783.       case $fgrep_status in
  784.         0|1) ;; # we don't actually care if any lines matched or not
  785.         *) die "error reading \"$ldsoconf\"; fgrep exited with status" \
  786.           "$fgrep_status" ;;
  787.       esac
  788.       set +e
  789.       cmp -s "$ldsoconf.dpkg-tmp" "$ldsoconf"
  790.       cmp_status=$?
  791.       set -e
  792.       case $cmp_status in
  793.         0) rm "$ldsoconf.dpkg-tmp" ;; # files are identical
  794.         1) mv "$ldsoconf.dpkg-tmp" "$ldsoconf" ;; # files differ
  795.         *) die "error comparing \"$ldsoconf.dpkg-tmp\" to \"$ldsoconf\";" \
  796.           "cmp exited with status $cmp_status" ;;
  797.       esac
  798.     fi
  799.   fi
  800. }
  801.  
  802. make_symlink_sane () {
  803.   # syntax: make_symlink_sane symlink target
  804.   #
  805.   # Ensure that the symbolic link symlink exists, and points to target.
  806.   #
  807.   # If symlink does not exist, create it and point it at target.
  808.   #
  809.   # If symlink exists but is not a symbolic link, back it up.
  810.   #
  811.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  812.   # it.
  813.   #
  814.   # If symlink exists, is a symbolic link, and already points to target, do
  815.   # nothing.
  816.   #
  817.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  818.  
  819.   # Validate arguments.
  820.   if [ $# -ne 2 ]; then
  821.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  822.       "expected 2, got $#"
  823.     exit $SHELL_LIB_USAGE_ERROR
  824.   fi
  825.  
  826.   # We could just use the positional parameters as-is, but that makes things
  827.   # harder to follow.
  828.   local symlink target
  829.  
  830.   symlink="$1"
  831.   target="$2"
  832.  
  833.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  834.       observe "link from $symlink to $target already exists"
  835.   else
  836.     observe "creating symbolic link from $symlink to $target"
  837.     mkdir -p "${target%/*}" "${symlink%/*}"
  838.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  839.   fi
  840. }
  841.  
  842. migrate_dir_to_symlink () {
  843.   # syntax: migrate_dir_to_symlink old_location new_location
  844.   #
  845.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  846.   # symbolic link to a directory or vice versa; instead, the existing state
  847.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  848.   # there is one."
  849.   #
  850.   # We have to do it ourselves.
  851.   #
  852.   # This function moves the contents of old_location, a directory, into
  853.   # new_location, a directory, then makes old_location a symbolic link to
  854.   # new_location.
  855.   #
  856.   # old_location need not exist, but if it does, it must be a directory (or a
  857.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  858.   # exists already and is not a directory, it is backed up.
  859.   #
  860.   # This function should be called from a package's preinst so that other
  861.   # packages unpacked after this one --- but before this package's postinst runs
  862.   # --- are unpacked into new_location even if their payloads contain
  863.   # old_location filespecs.
  864.  
  865.   # Validate arguments.
  866.   if [ $# -ne 2 ]; then
  867.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  868.                 "arguments; expected 2, got $#"
  869.     exit $SHELL_LIB_USAGE_ERROR
  870.   fi
  871.  
  872.   # We could just use the positional parameters as-is, but that makes things
  873.   # harder to follow.
  874.   local new old
  875.  
  876.   old="$1"
  877.   new="$2"
  878.  
  879.   # Is old location a symlink?
  880.   if [ -L "$old" ]; then
  881.     # Does it already point to new location?
  882.     if [ "$(readlink "$old")" = "$new" ]; then
  883.       # Nothing to do; migration has already been done.
  884.       observe "migration of $old to $new already done"
  885.       return 0
  886.     else
  887.       # Back it up.
  888.       warn "backing up symbolic link $old as $old.dpkg-old"
  889.       mv -b "$old" "$old.dpkg-old"
  890.     fi
  891.   fi
  892.  
  893.   # Does old location exist, but is not a directory?
  894.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  895.       # Back it up.
  896.       warn "backing up non-directory $old as $old.dpkg-old"
  897.       mv -b "$old" "$old.dpkg-old"
  898.   fi
  899.  
  900.   observe "migrating $old to $new"
  901.  
  902.   # Is new location a symlink?
  903.   if [ -L "$new" ]; then
  904.     # Does it point the wrong way, i.e., back to where we're migrating from?
  905.     if [ "$(readlink "$new")" = "$old" ]; then
  906.       # Get rid of it.
  907.       observe "removing symbolic link $new which points to $old"
  908.       rm "$new"
  909.     else
  910.       # Back it up.
  911.       warn "backing up symbolic link $new as $new.dpkg-old"
  912.       mv -b "$new" "$new.dpkg-old"
  913.     fi
  914.   fi
  915.  
  916.   # Does new location exist, but is not a directory?
  917.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  918.     warn "backing up non-directory $new as $new.dpkg-old"
  919.     mv -b "$new" "$new.dpkg-old"
  920.   fi
  921.  
  922.   # Create new directory if it does not yet exist.
  923.   if ! [ -e "$new" ]; then
  924.     observe "creating $new"
  925.     mkdir -p "$new"
  926.   fi
  927.  
  928.   # Copy files in old location to new location.  Back up any filenames that
  929.   # already exist in the new location with the extension ".dpkg-old".
  930.   observe "copying files from $old to $new"
  931.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  932.     die "error(s) encountered while copying files from $old to $new"
  933.   fi
  934.  
  935.   # Remove files at old location.
  936.   observe "removing $old"
  937.   rm -r "$old"
  938.  
  939.   # Create symlink from old location to new location.
  940.   make_symlink_sane "$old" "$new"
  941. }
  942.  
  943. # vim:set ai et sw=2 ts=2 tw=80:
  944.  
  945. # GOBSTOPPER: The X Strike Force shell library ends here.
  946.  
  947. CONFIG_DIR=/etc/X11
  948. XWRAPPER_CONFIG="$CONFIG_DIR/Xwrapper.config"
  949. OLD_CONFIG_FILE="$CONFIG_DIR/Xserver"
  950.  
  951. allowed_users_english_to_actual () {
  952.   case "$1" in
  953.     "Root Only")
  954.       echo "rootonly"
  955.       ;;
  956.     "Console Users Only")
  957.       echo "console"
  958.       ;;
  959.     "Anybody")
  960.       echo "anybody"
  961.       ;;
  962.     *)
  963.       # garbage input; return default
  964.       observe "allowed_users_english_to_actual(): unrecognized input \"$1\";" \
  965.               "using default"
  966.       echo "console"
  967.       ;;
  968.   esac
  969. }
  970.  
  971. allowed_users_actual_to_english () {
  972.   case "$1" in
  973.     "rootonly")
  974.       echo "Root Only"
  975.       ;;
  976.     "console")
  977.       echo "Console Users Only"
  978.       ;;
  979.     "anybody")
  980.       echo "Anybody"
  981.       ;;
  982.     *)
  983.       # garbage input; return default
  984.       observe "allowed_users_actual_to_english(): unrecognized input \"$1\";" \
  985.               "using default"
  986.       echo "Console Users Only"
  987.       ;;
  988.   esac
  989. }
  990.  
  991. validate_nice_value () {
  992.   _retval=1
  993.   # first, try to subtract number from itself to validate numeric input
  994.   # (expr is noisy, always throw away its output)
  995.   set +e
  996.   expr "$1" - "$1" > /dev/null 2>&1
  997.   if [ $? -eq 1 ]; then
  998.     # now check for valid range
  999.     if expr "$1" ">=" "-20" > /dev/null 2>&1 &&
  1000.        expr "$1" "<=" "19" > /dev/null 2>&1; then
  1001.        _retval=0
  1002.     fi
  1003.   fi
  1004.   set -e
  1005.   return $_retval
  1006. }
  1007.  
  1008. CURRENT_ALLOWED_USERS=
  1009. CURRENT_NICE_VALUE=
  1010.  
  1011. # scan the X wrapper config file for existing settings, if it exists
  1012. if [ -e "$XWRAPPER_CONFIG" ]; then
  1013.   if MATCHES=$(grep "^allowed_users=.\+" "$XWRAPPER_CONFIG"); then
  1014.     CURRENT_ALLOWED_USERS=$(echo "${MATCHES##*=}" | head -n 1)
  1015.   fi
  1016.   if MATCHES=$(grep "^nice_value=.\+" "$XWRAPPER_CONFIG"); then
  1017.     CURRENT_NICE_VALUE=$(echo "${MATCHES##*=}" | head -n 1)
  1018.   fi
  1019. fi
  1020.  
  1021. if [ -n "$CURRENT_ALLOWED_USERS" ]; then
  1022.   observe "setting x11-common/xwrapper/allowed_users from configuration" \
  1023.           "file"
  1024.   run db_set x11-common/xwrapper/allowed_users \
  1025.                       $(allowed_users_actual_to_english \
  1026.                       "$CURRENT_ALLOWED_USERS")
  1027. fi
  1028.  
  1029. if [ -n "$CURRENT_NICE_VALUE" ]; then
  1030.   observe "setting x11-common/xwrapper/nice_value from configuration file"
  1031.   if validate_nice_value "$CURRENT_NICE_VALUE"; then
  1032.     run db_set x11-common/xwrapper/nice_value \
  1033.                         "$CURRENT_NICE_VALUE"
  1034.   fi
  1035. fi
  1036.  
  1037. run db_input low x11-common/xwrapper/allowed_users
  1038. run db_go
  1039.  
  1040. RET=
  1041. if db_get x11-common/xwrapper/allowed_users; then
  1042.   if [ -n "$RET" ]; then
  1043.     run db_set x11-common/xwrapper/actual_allowed_users \
  1044.                         $(allowed_users_english_to_actual "$RET")
  1045.   fi
  1046. fi
  1047.  
  1048. # next question requires input validation; assume safe valid value already
  1049. # present (possibly the template default)
  1050. SAFE=
  1051. if db_get x11-common/xwrapper/nice_value; then
  1052.   SAFE="$RET"
  1053. fi
  1054.  
  1055. # make sure it's really safe; if not, use the default
  1056. if ! validate_nice_value "$RET"; then
  1057.   SAFE="0"
  1058.   run db_set x11-common/xwrapper/nice_value "$SAFE"
  1059. fi
  1060.  
  1061. set +e
  1062. while :; do
  1063.   db_input low x11-common/xwrapper/nice_value
  1064.   # is the question going to be asked?
  1065.   if [ $? -eq 30 ]; then
  1066.     break # no; bail out of validation loop
  1067.   fi
  1068.   run db_go
  1069.   RET=
  1070.   if db_get x11-common/xwrapper/nice_value; then
  1071.     # string, needs input validation
  1072.     if validate_nice_value "$RET"; then
  1073.       # valid input from user
  1074.       break
  1075.     else
  1076.       # the input was invalid; restore the known good value in case we are
  1077.       # interrupted before the user provides a valid one
  1078.       run db_set x11-common/xwrapper/nice_value "$SAFE"
  1079.       run db_fset x11-common/xwrapper/nice_value seen false
  1080.       # now display the error message
  1081.       run db_fset x11-common/xwrapper/nice_value/error seen false
  1082.       run db_input critical x11-common/xwrapper/nice_value/error
  1083.       run db_go
  1084.     fi
  1085.   fi
  1086. done
  1087. set -e
  1088.  
  1089. if [ "$1" = "configure" ] && dpkg --compare-versions "$2" lt "1:7.0.11"; then
  1090.       run db_input medium x11-common/upgrade_issues
  1091.       run db_go
  1092. fi
  1093.  
  1094. exit 0
  1095.  
  1096. # vim:set ai et sts=2 sw=2 tw=0:
  1097.